﻿#pragma once

#ifndef DLL_EXPORT
    #define API __declspec(dllexport)
#else
    #define API __declspec(dllimport)
#endif

// 游戏结束原因
enum GameOverReason {
    WON,        // 胜利
    LOST,       // 失败
    SELF_ADMIT, // 自己认输
    RIVAL_ADMIT // 对手认输
};

// 协议
class API GomokuProtocol {
    public: enum Type {
        FIND_USERS,     // 寻找其它用户
        GAME_OVER,      // 游戏结束
        INVITE_REQUEST, // 挑战请求
        INVITE_RESULT,  // 挑战结果
        LOGON,          // 登录
        PUT_PIECE,      // 放置棋子
        QUIT_GAME       // 退出游戏
    };

    public: static const int MAX_USER_COUNT = 50;                       // 最大用户数
    public: static const int MAX_USERNAME_LEN = 16;                     // 最大用户名长度
    private: static LPCTSTR SERVER_IP;                                  // 服务器 IP 地址
    public: static const short SERVER_PORT = 10000;                     // 服务器端口号
    public: static const int USERNAME_BUF_LEN = MAX_USERNAME_LEN + 1;   // 用户名缓存长度
    public: Type mType;                                                 // 类型
    public: TCHAR mUsername[USERNAME_BUF_LEN];                          // 用户名

    public: GomokuProtocol(Type, LPCTSTR);
    public: static LPCTSTR GetServerIP();
};

// 寻找用户请求
class API FindUsersRequest: public GomokuProtocol {
    public: FindUsersRequest(LPCTSTR);
};

// 寻找用户结果
class API FindUsersResult: public GomokuProtocol {
    public: TCHAR mUsernameList[MAX_USER_COUNT][USERNAME_BUF_LEN];  // 用户名列表
    
    public: FindUsersResult();
};

// 游戏结束
class API GameOver: public GomokuProtocol {
    public: GameOverReason mReason; // 结束原因
    
    public: GameOver(GameOverReason, LPCTSTR);
};

// 挑战请求
class API InviteRequest: public GomokuProtocol {
    public: TCHAR mRivalName[USERNAME_BUF_LEN]; // 对手的名字

    public: InviteRequest(LPCTSTR, LPCTSTR);
};

// 挑战结果
class API InviteResult: public GomokuProtocol {
    public: BOOL mAccept;                       // 接受挑战则为 TRUE，否则为 FALSE
    public: TCHAR mRivalName[USERNAME_BUF_LEN]; // 对手的名字

    public: InviteResult(BOOL, LPCTSTR, LPCTSTR);
};

// 登录请求
class API LogonRequest: public GomokuProtocol {
    public: LogonRequest(LPCTSTR);
};

// 登录结果
class API LogonResult: public GomokuProtocol {
    public: LogonResult(LPCTSTR);
};

// 放置棋子
class API PutPiece: public GomokuProtocol {
    public: int mX; // x 坐标（窗口坐标）
    public: int mY; // y 坐标（窗口坐标）

    public: PutPiece(LPCTSTR, int, int);
};

// 退出游戏
class API QuitGame: public GomokuProtocol {
    public: QuitGame(LPCTSTR);
};
